import React, { useEffect } from 'react';
import { Modal, Form, Input, InputNumber, Button, message } from 'antd';
import { Project, ProjectCreate, ProjectUpdate } from '../../types';

interface ProjectFormProps {
  visible: boolean;
  onCancel: () => void;
  onSubmit: (values: ProjectCreate | ProjectUpdate) => Promise<boolean>;
  initialValues?: Project;
  title: string;
}

const ProjectForm: React.FC<ProjectFormProps> = ({
  visible,
  onCancel,
  onSubmit,
  initialValues,
  title
}) => {
  const [form] = Form.useForm();

  // 当初始值变化时，更新表单值
  useEffect(() => {
    if (visible) {
      if (initialValues) {
        // 编辑模式：设置表单值
        form.setFieldsValue(initialValues);
      } else {
        // 新增模式：清空表单，明确设置所有字段为空
        form.resetFields();
        form.setFieldsValue({
          name: '',
          name_en: '',
          description: '',
          sort_order: 0,
          start_year: undefined,
          year_step: undefined,
          end_year: undefined,
          time_horizon: undefined
        });
      }
    } else {
      // 对话框关闭时只重置状态，不操作 form（因为 Form 组件可能已卸载）
      // form 会在下次打开时自动重置
    }
  }, [visible, initialValues, form]);

  const handleSubmit = async () => {
    try {
      const values = await form.validateFields();
      
      // 设置默认的 sort_order
      if (values.sort_order === undefined || values.sort_order === null) {
        values.sort_order = 0;
      }
      
      // 验证时间参数的一致性
      if (values.start_year && values.end_year && values.year_step && values.time_horizon) {
        const expectedTimeHorizon = Math.floor((values.end_year - values.start_year) / values.year_step) + 1;
        if (values.time_horizon !== expectedTimeHorizon) {
          message.error(`时间长度应为 ${expectedTimeHorizon} 年（根据起始年份、结束年份和步长计算）`);
          return;
        }
      }
      
      const ok = await onSubmit(values);
      if (ok) {
        form.resetFields();
        message.success(initialValues ? '项目更新成功' : '项目创建成功');
      }
    } catch (error) {
      console.error('Form validation failed:', error);
      // 如果提交失败，不关闭表单
    }
  };

  const handleCancel = () => {
    form.resetFields();
    onCancel();
  };

  // 自动计算时间长度
  const calculateTimeHorizon = (startYear: number, endYear: number, yearStep: number) => {
    if (startYear && endYear && yearStep) {
      return Math.floor((endYear - startYear) / yearStep) + 1;
    }
    return null;
  };

  // 监听时间字段变化，自动计算时间长度
  const handleTimeFieldChange = () => {
    const startYear = form.getFieldValue('start_year');
    const endYear = form.getFieldValue('end_year');
    const yearStep = form.getFieldValue('year_step');
    
    if (startYear && endYear && yearStep) {
      const calculatedHorizon = calculateTimeHorizon(startYear, endYear, yearStep);
      if (calculatedHorizon && calculatedHorizon > 0) {
        form.setFieldsValue({ time_horizon: calculatedHorizon });
      }
    }
  };

  return (
    <Modal
      title={title}
      open={visible}
      onCancel={handleCancel}
      onOk={handleSubmit}
      okText="确定"
      cancelText="取消"
      width={600}
      destroyOnHidden
    >
      <Form
        form={form}
        layout="vertical"
        requiredMark={false}
      >
        <Form.Item
          name="name"
          label="项目中文名称"
          rules={[
            { required: true, message: '请输入项目中文名称' },
            { max: 100, message: '项目名称不能超过100个字符' }
          ]}
        >
          <Input placeholder="请输入项目中文名称" />
        </Form.Item>

        <Form.Item
          name="name_en"
          label="项目英文名称"
          rules={[
            { required: true, message: '请输入项目英文名称' },
            { max: 100, message: '项目英文名称不能超过100个字符' },
            { pattern: /^[a-zA-Z_][a-zA-Z0-9_]*$/, message: '英文名称必须符合Python变量名规则：只能包含字母、数字和下划线，且不能以数字开头' }
          ]}
        >
          <Input placeholder="请输入项目英文名称" />
        </Form.Item>

        <Form.Item
          name="description"
          label="项目描述"
          rules={[
            { max: 500, message: '项目描述不能超过500个字符' }
          ]}
        >
          <Input.TextArea 
            placeholder="请输入项目描述（可选）" 
            rows={4}
            showCount
            maxLength={500}
          />
        </Form.Item>

        <Form.Item
          name="sort_order"
          label="排序顺序"
          initialValue={0}
          rules={[
            { type: 'number', min: 0, message: '排序顺序必须大于等于0' }
          ]}
        >
          <InputNumber 
            placeholder="数字越大越靠前，默认为0" 
            min={0}
            max={9999}
            style={{ width: '100%' }}
          />
        </Form.Item>

        <Form.Item
          name="start_year"
          label="起始年份"
          rules={[
            { required: true, message: '请输入起始年份' },
            { type: 'number', min: 1900, max: 2100, message: '起始年份必须在1900-2100之间' }
          ]}
        >
          <InputNumber 
            placeholder="请输入起始年份" 
            min={1900}
            max={2100}
            style={{ width: '100%' }}
            addonAfter="年"
            
            onChange={handleTimeFieldChange}
          />
        </Form.Item>

        <Form.Item
          name="year_step"
          label="年份步长"
          rules={[
            { required: true, message: '请输入年份步长' },
            { type: 'number', min: 1, message: '年份步长必须大于0' }
          ]}
        >
          <InputNumber 
            placeholder="请输入年份步长" 
            min={1}
            max={10}
            style={{ width: '100%' }}
            addonAfter="年"
            
            onChange={handleTimeFieldChange}
          />
        </Form.Item>

        <Form.Item
          name="end_year"
          label="结束年份"
          rules={[
            { required: true, message: '请输入结束年份' },
            { type: 'number', min: 1900, max: 2100, message: '结束年份必须在1900-2100之间' }
          ]}
        >
          <InputNumber 
            placeholder="请输入结束年份" 
            min={1900}
            max={2100}
            style={{ width: '100%' }}
            addonAfter="年"
            
            onChange={handleTimeFieldChange}
          />
        </Form.Item>

        <Form.Item
          name="time_horizon"
          label="时间长度（年）"
          rules={[
            { required: true, message: '请输入时间长度' },
            { type: 'number', min: 1, message: '时间长度必须大于0' }
          ]}
        >
          <InputNumber 
            placeholder="自动计算" 
            min={1}
            max={100}
            style={{ width: '100%' }}
            addonAfter="年"
            disabled={true}
            readOnly
          />
        </Form.Item>
      </Form>
    </Modal>
  );
};

export default ProjectForm;
